﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraCharts;
using System.Data.SqlClient;
using Lists;
using GeneralLibs;

namespace BI
{
    public partial class UcDashBoardDetail : UserControl
    {
        private static int _NumberOfReIndex = 0;

        public UcDashBoardDetail()
        {
            InitializeComponent();
        }

        private void UcDashBoardDetail_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);

            DateTime now = GeneralLibs.CommonLib.GetSystemDateTime();
            dtNgayKetThuc.DateTime = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
            //numInterval.Value = 7;
            cmbKyBaoCao.SelectedIndex = 17;
            cmbKyBaoCao.SelectedIndex = 18;

            ucDigitalNumberTienMat.gaugeControl1.Tag = string.Format("Lượng tiền mặt còn thực tế tại doanh nghiệp\r\nđến thời điểm {0}(Số dư 1111)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberTienGuiNganHang.gaugeControl1.Tag = string.Format("Lượng tiền gửi còn trong tài khoản ngân hàng của doanh nghiệp\r\nđến thời điểm {0} (Số dư 1121)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberHangHoa.gaugeControl1.Tag = string.Format("Tổng giá vốn của hàng hóa trong các kho của doanh nghiệp\r\nđến thời điểm {0} (Số dư 1561)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberDoanhSoBanBuon.gaugeControl1.Tag = "Tổng số tiền các Hóa đơn bán buôn - Hàng bán trả lại (bao gồm tiền thuế VAT)";
            ucDigitalNumberPhaiThu.gaugeControl1.Tag = string.Format("Tổng công nợ phải thu của doanh nghiệp đến thời điểm {0}(Số dư 131)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberPhaiTra.gaugeControl1.Tag = string.Format("Tổng công nợ phải trả của doanh nghiệp đến thời điểm {0}(Số dư 331)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberLaiGopBanBuon.gaugeControl1.Tag = string.Format("Lãi từ bán buôn trong kỳ được chọn (doanh số bán buôn cả thuế - giá vốn - trả lại)");
            ucDigitalNumberLaiGopBanLe.gaugeControl1.Tag = string.Format("Lãi từ bán lẻ trong kỳ được chọn (doanh số bán lẻ cả thuế - giá vốn)");
            ucDigitalNumberLaiGop.gaugeControl1.Tag = string.Format("Lãi từ bán hàng trong kỳ được chọn (doanh số bán hàng cả thuế - giá vốn - trả lại)");
            ucDigitalNumberTongThu.gaugeControl1.Tag = string.Format("Tổng số tiền đã được doanh nghiệp thu vào (Nợ 1111 và 1121)");
            ucDigitalNumberTongChi.gaugeControl1.Tag = string.Format("Tổng số tiền đã được doanh nghiệp chi ra (Có 1111 và 1121)");
            //ucDigitalNumberLoiNhuanTruocThue.gaugeControl1.Tag = string.Format("Tổng lợi nhuận trước thuế. Bao gồm:\r\nlãi trước thuế, lãi từ hoạt động tài chính, lãi từ hoạt động khác");
            ucDigitalNumberLaiTruChiPhi.gaugeControl1.Tag = string.Format("Số tiền lãi sau khi trừ các chi phí hoạt động và sản xuất\r\n(Lãi gộp + thu khác (515, 711)- tổng chi (641, 642, 334, 213, 811, 635)");
            ucDigitalNumberLoiNhuanThuc.gaugeControl1.Tag = string.Format("Số tiền lợi nhuận từ tổng các loại tiền lãi\r\ntrừ các chi phí hoạt động sản xuất (641, 642, 334, 213) và thuế (821, 333)");
            ucDigitalNumberThueThuNhap.gaugeControl1.Tag = string.Format("Số tiền phải trả thuế cho nhà nước trong kỳ được chọn (Phát sinh 821, 333)");
            ucDigitalNumberNguonVon.gaugeControl1.Tag = string.Format("Nguồn vốn còn lại tại doanh nghiệp đến thời điểm {0}(Số dư 411)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberTongChiPhiHoatDong.gaugeControl1.Tag = string.Format("Số tiền đã chi cho hoạt động doanh nghiệp (Phát sinh 641+642+334+3383+3384)");
            ucDigitalNumberChiPhiSanXuat.gaugeControl1.Tag = string.Format("Số tiền doang nghiệp đã chi cho sản xuất hàng hóa (Phát sinh 213)");
            ucDigitalNumberDoanhSoBanLe.gaugeControl1.Tag = string.Format("Tổng số tiền các hóa đơn bán lẻ (bao gồm tiền thuế VAT)");
            ucDigitalNumberThuKhac.gaugeControl1.Tag = string.Format("Số tiền được doanh nghiệp thu vào từ tài khoản thu khác (Phát sinh 711, 515)");
            ucDigitalNumberThuNguonVon.gaugeControl1.Tag = string.Format("Số tiền dạng nguồn vốn huy động được trong kỳ (Phát sinh 411)");
            ucDigitalNumberThuBanHang.gaugeControl1.Tag = string.Format("Số tiền doanh nghiệp thu được từ bán hàng");
            ucDigitalNumberChiMuaHang.gaugeControl1.Tag = string.Format("Số tiền đã được doanh nghiệp chi ra để mua hàng");
            ucDigitalNumberChiKhac.gaugeControl1.Tag = string.Format("Số tiền đã được doanh nghiệp chi cho các hoạt động khác (Có 1111,1121 và Nợ 811,635)");
            ucDigitalNumberChiNguonVon411.gaugeControl1.Tag = string.Format("Số tiền chi ra từ tài khoản nguồn vốn (Có 1111 Nợ 411)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));

            ucDoanhSoBanBuonSach.gaugeControl1.Tag = string.Format("Doanh số bán buôn các mặt hàng thuộc nhóm sách - trả lại");
            ucDoanhSoBanBuonHangKhac.gaugeControl1.Tag = string.Format("Doanh số bán buôn các mặt hàng khác (không phải sách) - trả lại");
            ucDoanhSoBanLeSach.gaugeControl1.Tag = string.Format("Doanh số bán lẻ các mặt hàng thuộc nhóm sách");
            ucDoanhSoBanLeHangKhac.gaugeControl1.Tag = string.Format("Doanh số bán lẻ các mặt hàng khác (không phải sách)");
        }

        private void cmbKyBaoCao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DateTime ngayBatDau = dtNgayBatDau.DateTime;
                DateTime ngayKetThuc = dtNgayBatDau.DateTime;
                DateTime now = GeneralLibs.CommonLib.GetSystemDateTime();
                switch (cmbKyBaoCao.Text)
                {
                    case "Hôm nay":
                        dtNgayBatDau.Enabled = true;
                        dtNgayKetThuc.Enabled = true;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
                        break;
                    case "Hôm qua":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).AddDays(-1);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59).AddDays(-1);
                        break;
                    case "Tuần gần nhất":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).AddDays(-7);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
                        break;
                    case "Tháng này":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
                        ngayKetThuc = new DateTime(now.Year, now.Month, System.DateTime.DaysInMonth(now.Year, now.Month), 23, 59, 59);
                        break;
                    case "Tùy chọn":
                        dtNgayBatDau.Enabled = true;
                        dtNgayKetThuc.Enabled = true;
                        ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(DateTime.Now);
                        ngayBatDau = thoiDiemKhoaSoGanNhat.ThoiDiem;
                        ngayKetThuc = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
                        break;
                    case "Cả năm":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 1, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 12, 31, 23, 59, 59);
                        break;
                    case "Quý I":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 1, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 3, 31, 23, 59, 59);
                        break;
                    case "Quý II":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 4, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 6, 30, 23, 59, 59);
                        break;
                    case "Quý III":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 7, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 9, 30, 23, 59, 59);
                        break;
                    case "Quý IV":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 10, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 12, 31, 23, 59, 59);
                        break;
                    default:
                        try
                        {
                            dtNgayBatDau.Enabled = false;
                            dtNgayKetThuc.Enabled = false;
                            string strThang = ((string)cmbKyBaoCao.SelectedItem).Substring(((string)(cmbKyBaoCao.SelectedItem)).LastIndexOf(" "));
                            int thang = int.Parse(strThang);

                            ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, thang, 1);
                            ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, thang,
                                            DateTime.DaysInMonth(GeneralLibs.Config.NamTaiChinh, thang), 23, 59, 59);
                        }
                        catch (SqlException sqlEx)
                        {
                            throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                        }
                        catch (Exception ex)
                        {
                            if (ex is CustomException) throw ex;
                            else
                            {
                                throw new Exception(ex.Message);
                            }
                        }
                        break;
                }
                dtNgayBatDau.DateTime = ngayBatDau;
                dtNgayKetThuc.DateTime = ngayKetThuc;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            DateTime ngayBatDau = dtNgayBatDau.DateTime;
            DateTime ngayKetThuc = dtNgayKetThuc.DateTime;
            ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(DateTime.Now);

            //5 Ngày reindex 3 lần
            if (Config.ThoiDiemReIndexGanNhat is NullableDate)
            {
                TimeSpan span = DateTime.Now - (DateTime)Config.ThoiDiemReIndexGanNhat.Date;
                if (span.TotalDays > 3) ReIndexDB();
            }
            else
            {
                ReIndexDB();
                Config.ThoiDiemReIndexGanNhat = new NullableDate(DateTime.Now);
            }

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand(); cmd.CommandTimeout = 10000 * 10;
                cmd.CommandText = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";
                cmd.ExecuteNonQuery();

                Guid taiKhoanLai = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("DoanhThuBanHangVaCungCapDichVu");

                Guid taiKhoanTienMatID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("TienMat");
                SoDuTaiKhoan soDuTaiKhoanTienMat = SoDuTaiKhoan.CalculateSoDuSauBuTru(ngayKetThuc, taiKhoanTienMatID);
                ucDigitalNumberTienMat.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanTienMat.DuNo);

                //Guid taiKhoanTienGuiNganHangID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("TienGuiNganHang");
                Guid taiKhoanTienGuiNganHangID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("112").ID;
                SoDuTaiKhoan soDuTaiKhoanTienGuiNganHang = SoDuTaiKhoan.CalculateSoDuSauBuTru(ngayKetThuc, taiKhoanTienGuiNganHangID);
                ucDigitalNumberTienGuiNganHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanTienGuiNganHang.DuNo);

                //Guid tkID = DanhMucTaiKhoan.Instance.GetBySoHieu("1561").ID;
                //SoDuTaiKhoan đo = SoDuTaiKhoan.CalculateSoDuSauBuTru(ngayKetThuc,tkID);
                //decimal ax = đo.DuNo - đo.DuCo;

                //Giá vốn còn lại = Tồn đầu kỳ + tổng vốn nhập - tổng vốn xuất
                //if (soDuTaiKhoanHangHoa.DuCo > 0)
                decimal giaTriTonKho = TonKho.CalculateGiaVonUocTinhConTrongKho(ngayKetThuc);
                ucDigitalNumberHangHoa.DisplayText = GeneralLibs.CommonLib.Decimal2Money(giaTriTonKho);

                //    MessageBox.Show("Cần kiểm tra lại số dư tài khoản hàng hóa. Hiện tại đang âm " + soDuTaiKhoanHangHoa.DuCo.ToString());
                //ucDigitalNumberHangHoa.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanHangHoa.DuNo);

                //Phải thu phải trả sau bù trừ
                if (chkTinhCongNo.Checked)
                {
                    List<decimal> phaiThuPhaiTraSauBuTru = CalculatorCongNoSauBuTru(cmd);
                    ucDigitalNumberPhaiThu.DisplayText = GeneralLibs.CommonLib.Decimal2Money(phaiThuPhaiTraSauBuTru[0]);
                    ucDigitalNumberPhaiTra.DisplayText = GeneralLibs.CommonLib.Decimal2Money(phaiThuPhaiTraSauBuTru[1]);
                }

                Guid taiKhoanDoanhThuID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("DoanhThuBanHangVaCungCapDichVu");
                //ucDigitalNumberDoanhSo.DisplayText = GeneralLibs.CommonLib.Decimal2Money(TaiKhoan.TinhSoPhatSinhCo(cmd, taiKhoanDoanhThuID, ngayBatDau, ngayKetThuc));

                decimal tongThu = NhatKyThuChi.TongThu(cmd, ngayBatDau, ngayKetThuc);
                decimal tongChi = NhatKyThuChi.TongChi(cmd, ngayBatDau, ngayKetThuc);
                ucDigitalNumberTongThu.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThu);
                ucDigitalNumberTongChi.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChi);

                //Chia thu làm 4 loại
                //Nguồn vốn 411
                TaiKhoan tk411 = DanhMucTaiKhoan.Instance.GetBySoHieu("411");
                SoDuTaiKhoan soDu411 = SoDuTaiKhoan.CalculatePhatSinhTrongKy_KhongBuTru(cmd, ngayBatDau, ngayKetThuc, tk411.ID);
                decimal phatSinhThu411 = soDu411.DuCo;  //Có là phát sinh thu
                ucDigitalNumberThuNguonVon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(phatSinhThu411);
                //Thu khác 711
                decimal thuKhac = 0;
                TaiKhoan tk711 = DanhMucTaiKhoan.Instance.GetBySoHieu("711");
                TaiKhoan tk515 = DanhMucTaiKhoan.Instance.GetBySoHieu("515");
                SoDuTaiKhoan soDu711 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk711.ID);
                SoDuTaiKhoan soDu515 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk515.ID);
                decimal phatSinh711 = Math.Abs(soDu711.DuNo - soDu711.DuCo);
                decimal phatSinh515 = Math.Abs(soDu515.DuNo - soDu515.DuCo);
                thuKhac = phatSinh711 + phatSinh515;
                ucDigitalNumberThuKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(thuKhac);
                //Thu bán hàng: thu từ Nợ 1111, 1121 và Có 131, 511
                decimal tongThuBanHang = NhatKyThuChi.TongThuBanHang(cmd, ngayBatDau, ngayKetThuc);
                ucDigitalNumberThuBanHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThuBanHang);

                //Chi chia làm 5 loại.
                //Chi khác 811, 635
                //7. Chi phí khác 811, 635
                decimal chiPhiKhac = 0;
                TaiKhoan tk811 = DanhMucTaiKhoan.Instance.GetBySoHieu("811");
                TaiKhoan tk635 = DanhMucTaiKhoan.Instance.GetBySoHieu("635");
                SoDuTaiKhoan soDu811 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk811.ID);
                SoDuTaiKhoan soDu635 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk635.ID);
                decimal phatSinh811 = Math.Abs(soDu811.DuCo - soDu811.DuNo);
                decimal phatSinh635 = Math.Abs(soDu635.DuCo - soDu635.DuNo);
                chiPhiKhac = phatSinh811 + phatSinh635;

                ucDigitalNumberChiKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(chiPhiKhac);
                //Chi phí hoạt động và sản xuất 641 . 642
                decimal chiPhiHoatDong = 0;
                TaiKhoan tk641 = DanhMucTaiKhoan.Instance.GetBySoHieu("641");
                TaiKhoan tk642 = DanhMucTaiKhoan.Instance.GetBySoHieu("642");
                TaiKhoan tk334 = DanhMucTaiKhoan.Instance.GetBySoHieu("334");
                TaiKhoan tk3383 = DanhMucTaiKhoan.Instance.GetBySoHieu("3383");
                TaiKhoan tk3384 = DanhMucTaiKhoan.Instance.GetBySoHieu("3384");

                SoDuTaiKhoan soDu641 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk641.ID);
                SoDuTaiKhoan soDu642 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk642.ID);
                SoDuTaiKhoan soDu334 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk334.ID);
                SoDuTaiKhoan soDu3383 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk3383.ID);
                SoDuTaiKhoan soDu3384 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk3384.ID);

                decimal phatSinh641 = Math.Abs(soDu641.DuNo - soDu641.DuCo);
                decimal phatSinh642 = Math.Abs(soDu642.DuNo - soDu642.DuCo);
                decimal phatSinh334 = Math.Abs(soDu334.DuNo - soDu334.DuCo);
                decimal phatSinh3383 = Math.Abs(soDu3383.DuNo - soDu3383.DuCo);
                decimal phatSinh3384 = Math.Abs(soDu3384.DuNo - soDu3384.DuCo);

                chiPhiHoatDong = phatSinh641 + phatSinh642 + phatSinh334 + phatSinh3383 + phatSinh3384;
                ucDigitalNumberTongChiPhiHoatDong.DisplayText = GeneralLibs.CommonLib.Decimal2Money(chiPhiHoatDong);

                //Chi phí sản xuất
                Guid taiKhoanChiPhiSXID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("213").ID;
                SoDuTaiKhoan soDu213 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, taiKhoanChiPhiSXID);
                decimal chiPhiSX = Math.Abs(soDu213.DuNo - soDu213.DuCo);

                ucDigitalNumberChiPhiSanXuat.DisplayText = GeneralLibs.CommonLib.Decimal2Money(chiPhiSX);
                //Chi nguồn vốn 411
                //Nguồn vốn 411
                decimal phatSinhChi411 = soDu411.DuNo;   //Nợ là phát sinh chi
                ucDigitalNumberChiNguonVon411.DisplayText = GeneralLibs.CommonLib.Decimal2Money(phatSinhChi411);

                //chi phí mua hàng
                decimal tongChiPhiMuaHang = NhatKyThuChi.TongChiMuaHang(cmd, ngayBatDau, ngayKetThuc);
                ucDigitalNumberChiMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChiPhiMuaHang);

                decimal laiGop = 0, laiGopBanBuon = 0, laiGopBanLe = 0;
                decimal doanhSo = 0, doanhSoBanBuon = 0, doanhSoBanLe = 0;
                decimal doanhSoBanBuonSach = 0, doanhSoBanBuonVPP = 0;
                decimal doanhSoTraLai = 0, doanhSoTraLaiSach = 0, doanhSoTraLaiVPP = 0;
                decimal laiTraLai = 0;

                #region tinh doanh số - lai gop trong ky

                #region Tính số tiền HangBanTraLai (tổng, bán buôn, bán lẻ)
                //Doanh số trả lại tổng
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoTraLai, SUM(Value7 - Value3) AS Lai \n" +
                                    "FROM KhoanMucChungTu  \n" +
                                    "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu   \n" +
                                    "					WHERE ChungTuGocID IN (SELECT ChungTuID  \n" +
                                    "											FROM ChungTu  \n" +
                                    "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu  \n" +
                                    "																	WHERE Ma IN (N'HangBanTraLai')  \n" +
                                    "																	)  \n" +
                                    "											AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi \n" +
                                    "											) \n" +
                                    "                  ) \n" +
                                    " AND Value5 IS NOT NULL AND Value3 IS NOT NULL \n";

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoTraLai"] != DBNull.Value)
                        {
                            doanhSoTraLai = (decimal)dr["DoanhSoTraLai"];
                        }
                        if (dr["Lai"] != DBNull.Value)
                        {
                            laiTraLai = (decimal)dr["Lai"];
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();

                //Doanh số trả lại SACH
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoTraLaiSach  \n" +
                                    "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HangBanTraLai')  \n" +
                                    "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1   \n" +
                                    "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID  \n" +
                                    "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID  \n" +
                                    "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID  \n" +
                                    "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID   \n" +
                                    "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR  \n" +
                                    "	E.NhomVatTuHangHoaChaID IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH'))  \n" +
                                    "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n";

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoTraLaiSach"] != DBNull.Value)
                        {
                            doanhSoTraLaiSach = (decimal)dr["DoanhSoTraLaiSach"];
                            //ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoTraLaiSach"]);
                        }

                    }
                    catch
                    {
                    }
                }
                dr.Close();

                //Doanh số trả lại HANG KHAC
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoTraLaiVPP  \n" +
                                    "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HangBanTraLai')  \n" +
                                    "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1   \n" +
                                    "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID  \n" +
                                    "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID  \n" +
                                    "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID  \n" +
                                    "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID   \n" +
                                   "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma != 'SACH') AND \n" +
                                     "	(E.NhomVatTuHangHoaChaID NOT IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR NhomVatTuHangHoaChaID IS NULL)) \n" +
                                     "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL \n";

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoTraLaiVPP"] != DBNull.Value)
                        {
                            doanhSoTraLaiVPP = (decimal)dr["DoanhSoTraLaiVPP"];
                            //ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoTraLaiVPP"]);
                        }

                    }
                    catch
                    {
                    }
                }
                dr.Close();
                #endregion

                #region Tính lãi tổng
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBan, SUM(Value7 - Value3) AS Lai\n" +
                                        "FROM KhoanMucChungTu \n" +
                                        "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                        "					WHERE ChungTuGocID IN (SELECT ChungTuID \n" +
                                        "											FROM ChungTu \n" +
                                        "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                        "																	WHERE Ma IN (N'HoaDonBanHang', N'HoaDonBanLe') \n" +
                                        "																	) \n" +
                                        "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1\n" +
                                        "											)\n" +
                                        "                   )\n" +
                                        " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                ucDigitalNumberLaiGop.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["Lai"] != DBNull.Value)
                        {
                            laiGop = (decimal)dr["Lai"];
                            laiGop = laiGop - laiTraLai;
                            ucDigitalNumberLaiGop.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiGop);
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();
                #endregion

                #region Tách doanh số bán buôn và bán lẻ
                ucDigitalNumberDoanhSoBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDigitalNumberLaiGopBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDigitalNumberLaiGopBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value

                //bán buôn
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBanBuon, SUM(Value7 - Value3) AS LaiBanBuon\n" +
                                        "FROM KhoanMucChungTu \n" +
                                        "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                        "					WHERE ChungTuGocID IN (SELECT ChungTuID \n" +
                                        "											FROM ChungTu \n" +
                                        "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                        "																	WHERE Ma IN (N'HoaDonBanHang') \n" +
                                        "																	) \n" +
                                        "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1\n" +
                                        "											)\n" +
                                        "                   )\n" +
                                        " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoBanBuon"] != DBNull.Value)
                        {
                            doanhSoBanBuon = (decimal)dr["DoanhSoBanBuon"];
                            doanhSoBanBuon = doanhSoBanBuon - doanhSoTraLai;
                        }
                        else
                        {
                            doanhSoBanBuon = doanhSoBanBuon - doanhSoTraLai;
                        }
                        ucDigitalNumberDoanhSoBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(doanhSoBanBuon);

                        if (dr["LaiBanBuon"] != DBNull.Value)
                        {
                            laiGopBanBuon = (decimal)dr["LaiBanBuon"];
                            laiGopBanBuon = laiGopBanBuon - laiTraLai;
                        }
                        else
                        {
                            laiGopBanBuon = laiGopBanBuon - laiTraLai;
                        }
                        ucDigitalNumberLaiGopBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiGopBanBuon);
                    }
                    catch
                    {
                    }
                }
                dr.Close();

                //bán lẻ
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBanLe,  SUM(Value7 - Value3) AS LaiBanLe\n" +
                                      "FROM KhoanMucChungTu \n" +
                                      "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                      "					WHERE GhiSo = 1 AND ChungTuGocID IN (SELECT ChungTuID \n" +
                                      "											FROM ChungTu \n" +
                                      "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                      "																	WHERE Ma IN (N'HoaDonBanLe') \n" +
                                      "																	) \n" +
                                      "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi \n" +
                                      "											)\n" +
                                      "                   )\n" +
                                      " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoBanLe"] != DBNull.Value)
                        {
                            doanhSoBanLe = (decimal)dr["DoanhSoBanLe"];
                            ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoBanLe"]);
                        }
                        if (dr["LaiBanLe"] != DBNull.Value)
                        {
                            laiGopBanLe = (decimal)dr["LaiBanLe"];
                            ucDigitalNumberLaiGopBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["LaiBanLe"]);
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();
                #endregion

                #region Tách doanh số Sách và Hàng khác trong Bán buôn, Bán lẻ
                ucDoanhSoBanBuonSach.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDoanhSoBanBuonHangKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDoanhSoBanLeSach.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                ucDoanhSoBanLeHangKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value

                #region For SACH

                //Sách - bán buôn
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoSach   --,  SUM(C.Value7 - C.Value3) AS LaiSach \n" +
                                     "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HoaDonBanHang') \n" +
                                     "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1  \n" +
                                     "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID \n" +
                                     "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID \n" +
                                     "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID \n" +
                                     "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID  \n" +
                                     "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR \n" +
                                     "	E.NhomVatTuHangHoaChaID IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH')) \n" +
                                     "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL \n";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoSach"] != DBNull.Value)
                        {
                            doanhSoBanBuonSach = (decimal)dr["DoanhSoSach"];
                            doanhSoBanBuonSach = doanhSoBanBuonSach - doanhSoTraLaiSach;
                        }
                        else
                        {
                            doanhSoBanBuonSach = doanhSoBanBuonSach - doanhSoTraLaiSach;
                        }
                        ucDoanhSoBanBuonSach.DisplayText = GeneralLibs.CommonLib.Decimal2Money(doanhSoBanBuonSach);
                    }
                    catch
                    { }
                }
                dr.Close();

                //Sách - Bán Lẻ
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoSach   --,  SUM(C.Value7 - C.Value3) AS LaiSach \n" +
                                     "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HoaDonBanLe') \n" +
                                     "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1  \n" +
                                     "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID \n" +
                                     "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID \n" +
                                     "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID \n" +
                                     "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID  \n" +
                                     "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR \n" +
                                     "	E.NhomVatTuHangHoaChaID IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH')) \n" +
                                     "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL \n";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoSach"] != DBNull.Value)
                            ucDoanhSoBanLeSach.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoSach"]);
                    }
                    catch
                    { }
                }
                dr.Close();

                #endregion

                #region For hàng khác
                //Hàng khác - Bán Buôn
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoVPP --,  SUM(C.Value7 - C.Value3) AS LaiVPP \n" +
                                     "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HoaDonBanHang') \n" +
                                     "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1  \n" +
                                     "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID \n" +
                                     "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID \n" +
                                     "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID \n" +
                                     "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID  \n" +
                                     "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma != 'SACH') AND \n" +
                                     "	(E.NhomVatTuHangHoaChaID NOT IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR NhomVatTuHangHoaChaID IS NULL)) \n" +
                                     "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL \n";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoVPP"] != DBNull.Value)
                        {
                            doanhSoBanBuonVPP = (decimal)dr["DoanhSoVPP"];
                            doanhSoBanBuonVPP = doanhSoBanBuonVPP - doanhSoTraLaiVPP;
                        }
                        else
                        {
                            doanhSoBanBuonVPP = doanhSoBanBuonVPP - doanhSoTraLaiVPP;
                        }
                        ucDoanhSoBanBuonHangKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(doanhSoBanBuonVPP);
                    }
                    catch
                    { }
                }
                dr.Close();

                //Hàng khác - Lẻ
                cmd.CommandText = "SELECT SUM(C.Value7) AS DoanhSoVPP --,  SUM(C.Value7 - C.Value3) AS LaiVPP \n" +
                                     "FROM ChungTu A INNER JOIN LoaiChungTu LCT ON LCT.ID = A.LoaiChungTuID AND LCT.Ma IN (N'HoaDonBanLe') \n" +
                                     "												AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1  \n" +
                                     "	INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID \n" +
                                     "	INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID \n" +
                                     "	INNER JOIN VatTuHangHoa D ON D.ID = C.VatTuHangHoa1ID \n" +
                                     "	INNER JOIN NhomVatTuHangHoa E ON E.ID = D.NhomVatTuHangHoaID  \n" +
                                     "WHERE (E.ID IN (SELECT ID FROM NhomVatTuHangHoa WHERE Ma != 'SACH') AND \n" +
                                     "	(E.NhomVatTuHangHoaChaID NOT IN  (SELECT ID FROM NhomVatTuHangHoa WHERE Ma = 'SACH') OR NhomVatTuHangHoaChaID IS NULL)) \n" +
                                     "	AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL \n";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);

                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoVPP"] != DBNull.Value)
                        {
                            ucDoanhSoBanLeHangKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoVPP"]);
                        }
                    }
                    catch
                    { }
                }
                dr.Close();

                #endregion

                #endregion

                #endregion

                #region tinh doanh so mua hang
                //cmd.CommandText = "SELECT SUM(SotienNT) DoanhSoMuaHang\n" +
                //                    "FROM ChungTu  \n" +
                //                    "WHERE LoaiChungTuID = (SELECT ID FROM LoaiChungTu  \n" +
                //                    "						WHERE Ma = N'HoaDonMuaHang' \n" +
                //                    "						)         \n" +
                //                    "       AND SoTienNT IS NOT NULL AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1";
                //cmd.Parameters.Clear();
                //cmd.Parameters.AddWithValue("ThoiDiemDau", ngayBatDau);
                //cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayKetThuc);
                //dr = cmd.ExecuteReader();

                //ucDigitalNumberMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                //if (dr.Read())
                //{
                //    try
                //    {
                //        if (dr["DoanhSoMuaHang"] != DBNull.Value)
                //            ucDigitalNumberMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoMuaHang"]);
                //    }
                //    catch
                //    {
                //    }
                //}
                //dr.Close();
                #endregion

                //lãi gộp trừ chi phí (lợi nhuận trước thuế)
                decimal tongChiPhi = chiPhiHoatDong + chiPhiSX + chiPhiKhac;
                decimal loiNhuanTruocThue = laiGop + thuKhac - tongChiPhi;
                ucDigitalNumberLaiTruChiPhi.DisplayText = GeneralLibs.CommonLib.Decimal2Money(loiNhuanTruocThue);

                //Thuế thu nhập doanh nghiệp
                TaiKhoan tk821 = DanhMucTaiKhoan.Instance.GetBySoHieu("821");  // Thuế thu nhập doanh nghiệp
                TaiKhoan tk333 = DanhMucTaiKhoan.Instance.GetBySoHieu("333");  //THuế VAT
                SoDuTaiKhoan soDu821 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk821.ID);
                SoDuTaiKhoan soDu333 = SoDuTaiKhoan.CalculatePhatSinhTrongKySauBuTru(cmd, ngayBatDau, ngayKetThuc, tk333.ID);
                decimal phatSinh821 = Math.Abs(soDu821.DuNo - soDu821.DuCo);
                decimal phatSinh333 = Math.Abs(soDu333.DuNo - soDu333.DuCo);

                decimal tienThue = phatSinh821 + phatSinh333;

                ucDigitalNumberThueThuNhap.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tienThue);

                //Lãi lỗ thực (sau thuế)
                decimal laiLoThuc = loiNhuanTruocThue - tienThue;
                ucDigitalNumberLoiNhuanThuc.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiLoThuc);

                //NguonVonKinhDoanh
                Guid taiKhoanNguonVonKinhDoanhID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("4111").ID;
                SoDuTaiKhoan soDuTaiKhoanNguonVonKinhDoanh = SoDuTaiKhoan.CalculateSoDuSauBuTru(ngayKetThuc, taiKhoanNguonVonKinhDoanhID);
                ucDigitalNumberNguonVon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanNguonVonKinhDoanh.DuNo - soDuTaiKhoanNguonVonKinhDoanh.DuCo);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private List<decimal> CalculatorCongNoSauBuTru(SqlCommand cmd)
        {
            try
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Mã", typeof(string));
                dt.Columns.Add("Tên", typeof(string));
                dt.Columns.Add("Phải thu (sau bù trừ)", typeof(decimal));
                dt.Columns.Add("Phải trả (sau bù trừ)", typeof(decimal));

                List<decimal> result = new List<decimal>();
                cmd.CommandTimeout = Config.TimeOut;
                Guid taiKhoanPhaiThuID = DanhMucTaiKhoan.Instance.GetBySoHieu("131").ID;
                Guid taiKhoanPhaiTraID = DanhMucTaiKhoan.Instance.GetBySoHieu("331").ID;
                decimal phaiThuSauBuTru = 0, phaiTraSauBuTru = 0;
                int count = 0;

                foreach (DoiTuongNghiepVu dtNV in DanhMucDoiTuongNghiepVu.GetDanhMucDoiTac())
                {
                    DataRow row = dt.NewRow();
                    row["Mã"] = dtNV.Ma;
                    row["Tên"] = dtNV.Ten;

                    BasicForms.FrmProgressBar.Status = string.Format("Đã xử lý {0}/{1} công nợ đối tác.", count++, DanhMucDoiTuongNghiepVu.GetDanhMucDoiTac().Count);
                    SoDuTheoDoiTuong noPhaiThu = SoDuTheoDoiTuong.CalculateFromDB(cmd, dtNgayKetThuc.DateTime, taiKhoanPhaiThuID, dtNV.ID);
                    SoDuTheoDoiTuong noPhaiTra = SoDuTheoDoiTuong.CalculateFromDB(cmd, dtNgayKetThuc.DateTime, taiKhoanPhaiTraID, dtNV.ID);
                    decimal phaiThu = noPhaiThu.DuNo - noPhaiThu.DuCo;
                    decimal phaiTra = noPhaiTra.DuCo - noPhaiTra.DuNo;
                    decimal soDu = phaiThu - phaiTra;
                    if (Math.Abs(soDu) > 0)
                    {
                        if (phaiThu >= phaiTra)
                        {
                            phaiThuSauBuTru += Math.Abs(soDu);
                            row["Phải thu (sau bù trừ)"] = Math.Abs(soDu);
                        }
                        else
                        {
                            phaiTraSauBuTru += Math.Abs(soDu);
                            row["Phải trả (sau bù trừ)"] = Math.Abs(soDu);
                        }
                    }

                    dt.Rows.Add(row);
                }
                //if (MessageBox.Show("Bạn có muốn xuất file excel công nợ của từng nhà không?", "Thông báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                //    ExportToExcel.ExportDataToExcel(dt, "Bảng kê công nợ tổng hợp");

                result.Add(phaiThuSauBuTru);
                result.Add(phaiTraSauBuTru);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                BasicForms.FrmProgressBar.Status = "";
            }
        }

        private void ReIndexDB()
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand(); cmd.CommandTimeout = Config.TimeOut;
                cmd.CommandTimeout = 1000 * 10;
                cmd.CommandText = string.Format("DECLARE @MyTable VARCHAR(255) \n" +
                                                "DECLARE myCursor CURSOR FOR \n" +
                                                "   SELECT table_name \n" +
                                                "   FROM information_schema.tables \n" +
                                                "   WHERE table_type = 'base table' \n" +
                                                "OPEN myCursor \n" +
                                                "FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "WHILE @@FETCH_STATUS = 0 \n" +
                                                "BEGIN \n" +
                                                "   PRINT 'Reindexing Table:  ' + @MyTable \n" +
                                                "   DBCC DBREINDEX(@MyTable, '', 80) \n" +
                                                "   FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "END \n" +
                                                "CLOSE myCursor \n" +
                                                "DEALLOCATE myCursor \n" +
                                                "EXEC sp_updatestats \n"
                                                );
                BasicForms.FrmProgressBar.StartShowProgress("Đang đánh lại chỉ mục cho các bảng trong CSDL để tăng tốc độ truy vấn");
                cmd.ExecuteNonQuery();
                Config.ThoiDiemReIndexGanNhat = new NullableDate(DateTime.Now);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Gặp sự cố khi đánh lại chỉ mục cho các bảng trong CSDL");
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
                if (con.State == ConnectionState.Open) con.Close();
            }
        }

        private void btnSuDungBIcu_Click(object sender, EventArgs e)
        {
            if (this.ParentForm is BIMainForm)
                (this.ParentForm as BIMainForm).SuDungMauBICu();
        }
    }
}
